/*
 *   Tempero - A simple program to registry all activities of day in a xls file
 *   Copyright (C) 2007  Daniel de Paula Porto
 *
 *   This program is free software: you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation, either version 3 of the License, or
 *   (at your option) any later version.
 *
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details.
 *
 *   You should have received a copy of the GNU General Public License
 *   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * ControleMain.java
 * Created on 17 de Setembro de 2007, 10:01
 */

package tempero.controle;

import java.util.GregorianCalendar;
import tempero.modelo.Atividade;
import tempero.visao.BemVindoFrame;
import tempero.visao.SplashFrame;
import tempero.visao.SystemTrayIcon;
import java.awt.AWTException;
import java.awt.Image;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.Toolkit;
import java.awt.TrayIcon;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.ImageIcon;
import javax.swing.JDialog;
import javax.swing.JFrame;

/**
 * Classe principal de execucao do Tempero
 * @author Daniel
 */
public class ControleMain
{
    
    private static ControleExcel ctrExcel;
    private static ControleProperties ctrProp;
    private Atividade atividadeAtual;
    private static Logger logger;
    private static FileHandler fh;
    private SplashFrame splash = new SplashFrame();
    
    /**
     * Cria uma nova instancia do ControleMain
     */
    public ControleMain()
    {
        splash.setVisible(true);
        ConfiguraLog();
        ctrExcel = new ControleExcel(this, logger);
        carregaProperties();
        //configuraSystemTray();
        splash.setVisible(false);
    }
    
    /**
     * Metodo inicial
     * @param args the command line arguments
     */
    public static void main(String[] args)
    {
        //inicia o aplicativo
        ControleMain cm = new ControleMain();
    }
    
    /**
     * Configura o arquivo de log
     */
    public void ConfiguraLog()
    {
        logger = Logger.getLogger("TemperoLog");
        FileHandler fh = null;
        try
        {
            fh = new FileHandler("TemperoLog.xml");
        }
        catch (SecurityException ex)
        {
            ex.printStackTrace();
        }
        catch (IOException ex)
        {
            ex.printStackTrace();
        }
        // Send logger output to our FileHandler.
        logger.addHandler(fh);
        // Request that every detail gets logged.
        logger.setLevel(Level.ALL);
        
        logger.info("teste log");
    }
    
    /** Carrega as propriedades do sistema*/
    public void carregaProperties()
    {
        ctrProp = new ControleProperties();
        
        try
        {
            ctrProp.leProperties();
            configuraSystemTray();
        }
        catch (FileNotFoundException ex)
        {
            try
            {
                //se for a primeira execu��o, o arquivo de propriedades
                //n�o ser� emcontrado
                //criar um arquivo de propriedades
                ctrProp.criaProperties();
                executaPrimeiraVez();
            }
            catch (FileNotFoundException e)
            {
                logger.log(Level.SEVERE, "Exce��o lan�ada", e);
                e.printStackTrace();
            }
            catch (IOException e)
            {
                logger.log(Level.SEVERE, "Exce��o lan�ada", e);
                e.printStackTrace();
            }
            
            
        }
        catch (IOException ex)
        {
            logger.log(Level.SEVERE, "Exce��o lan�ada", ex);
            ex.printStackTrace();
        }
    }
    
    /** A��es a serem executadas na primeira execu��o do programa */
    private void executaPrimeiraVez()
    {
        /*DialogPrimeiraVez dpv = new DialogPrimeiraVez(null,true,this);
        dpv.setVisible(true);
         */
        BemVindoFrame bvf = new BemVindoFrame(this);
        splash.setVisible(false);
        bvf.setVisible(true);
    }
    
    public void apagaPropriedades()
    {
        ctrProp.deletaPropriedades();
    }
    
    /**
     * Atualiza a propriedade do nome do arquivo
     * @param arquivo path do arquivo excel
     */
    public void atualizaArquivo(String arquivo)
    {
        ctrProp.salvaPropriedade(ctrProp.PATH,arquivo);
    }
    
    /**
     * Cria um novo arquivo excel com base no template
     * @param path path do arquivo excel
     */
    public void criaNovoArquivo(String path)
    {
        String arquivo = path+System.getProperty("file.separator")+ctrProp.EXCELFILE;
        ctrProp.salvaPropriedade(ctrProp.PATH , arquivo );
        ctrExcel.criaArquivoExcel( ctrProp.TEMPLATEFILE , arquivo );
    }
    
    /**
     * recupera o path do arquivo excel
     * @return path do arquivo excel
     */
    public String getPathArquivo()
    {
        return ctrProp.lePropriedade( ctrProp.PATH );
    }
    
    /** Cria um atalho para a aplica��o no System tray */
    public void configuraSystemTray()
    {
        String atividadeAntiga = ctrProp.lePropriedade( ctrProp.INICIO );
        boolean possuiAtividade = atividadeAntiga!=null && !atividadeAntiga.isEmpty();
        try
        {
            SystemTrayIcon sti = new SystemTrayIcon( this,possuiAtividade );
            if( possuiAtividade )
            {
                iniciaAtividade(Long.parseLong(atividadeAntiga));
            }
            
        }
        catch (AWTException ex)
        {
            logger.log(Level.SEVERE, "Exce��o lan�ada", ex);
            ex.printStackTrace();
        }
    }
    
    /**
     * Inicia uma nova atividade
     * @param time tempo em milisegundos do inicio da atividade
     */
    public void iniciaAtividade(long time)
    {
        atividadeAtual = new Atividade(time);
        ctrProp.salvaPropriedade(ctrProp.INICIO,Long.toString( time ) );
        salvaPropriedades();
    }
    
    public GregorianCalendar getAtividadeAtual()
    {
        if( atividadeAtual != null )
        {
            return atividadeAtual.getInicio();
        }
        return null;
    }
    
    /**
     * Finaliza a atividade atual
     * @param time Tempo em milisegundos da finalizacao da atividade
     * @param descricao descricao da atividade
     */
    public void finalizaAtividade(long time, String descricao)
    {
        atividadeAtual.setDescricao(descricao);
        atividadeAtual.setFim(time);
        ctrExcel.finalizaAtividade(atividadeAtual);
        ctrProp.limpaPropriedade( ctrProp.INICIO );
        salvaPropriedades();
    }
    
    
    /** Salva o arquivo de propriedades */
    public void salvaPropriedades()
    {
        try
        {
            ctrProp.salvaPropriedades();
        }
        catch (FileNotFoundException ex)
        {
            logger.log(Level.SEVERE, "Exce��o lan�ada", ex);
            ex.printStackTrace();
        }
        catch (IOException ex)
        {
            logger.log(Level.SEVERE, "Exce��o lan�ada", ex);
            ex.printStackTrace();
        }
    }
    
    /**
     * Busca todas as atividades do mes atual
     * @return Recupera uma lista com todas as diferentes atividades realizadas no mes atual
     */
    public String[] getAtividadesRecentes()
    {
        return ctrExcel.getAtividadesRecentes();
    }
}
